using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._PointCloud._Conversion
{
    /// <summary>
    /// <para>LAS To Multipoint</para>
    /// <para>Creates multipoint features using one or more lidar files.</para>
    /// <para>使用一个或多个激光雷达文件创建多点要素。</para>
    /// </summary>    
    [DisplayName("LAS To Multipoint")]
    public class LASToMultipoint : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public LASToMultipoint()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_input">
        /// <para>Input</para>
        /// <para><xdoc>
        ///   <para>The LAS or ZLAS files that will be imported to a multipoint feature class. If a folder is specified, all the LAS files that reside therein will be imported.</para>
        ///   <para>In the tool dialog box, a folder can also be specified as an input by selecting the folder in Windows Explorer and dragging it onto the parameter's input box.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>将导入到多点要素类的 LAS 或 ZLAS 文件。如果指定了文件夹，则将导入驻留在其中的所有 LAS 文件。</para>
        ///   <para>在工具对话框中，还可以通过在 Windows 资源管理器中选择文件夹并将其拖动到参数的输入框中，将文件夹指定为输入。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The feature class that will be produced.</para>
        /// <para>将生成的要素类。</para>
        /// </param>
        /// <param name="_average_point_spacing">
        /// <para>Average Point Spacing</para>
        /// <para>The average 2D distance between points in the input file or files. This can be an approximation. If areas have been sampled at different densities, specify the smaller spacing. The value needs to be provided in the projection units of the output coordinate system.</para>
        /// <para>输入文件中一个或多个点之间的平均 2D 距离。这可以是一个近似值。如果以不同的密度对区域进行采样，请指定较小的间距。该值需要在输出坐标系的投影单位中提供。</para>
        /// </param>
        public LASToMultipoint(List<object> _input, object _out_feature_class, double? _average_point_spacing)
        {
            this._input = _input;
            this._out_feature_class = _out_feature_class;
            this._average_point_spacing = _average_point_spacing;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "LAS To Multipoint";

        public override string CallName => "3d.LASToMultipoint";

        public override List<string> AcceptEnvironments => ["XYDomain", "XYResolution", "XYTolerance", "ZDomain", "ZResolution", "ZTolerance", "autoCommit", "configKeyword", "extent", "geographicTransformations", "outputCoordinateSystem", "workspace"];

        public override object[] ParameterInfo => [_input, _out_feature_class, _average_point_spacing, _class_code, _return, _attribute, _input_coordinate_system, _file_suffix, _z_factor, _folder_recursion.GetGPValue()];

        /// <summary>
        /// <para>Input</para>
        /// <para><xdoc>
        ///   <para>The LAS or ZLAS files that will be imported to a multipoint feature class. If a folder is specified, all the LAS files that reside therein will be imported.</para>
        ///   <para>In the tool dialog box, a folder can also be specified as an input by selecting the folder in Windows Explorer and dragging it onto the parameter's input box.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>将导入到多点要素类的 LAS 或 ZLAS 文件。如果指定了文件夹，则将导入驻留在其中的所有 LAS 文件。</para>
        ///   <para>在工具对话框中，还可以通过在 Windows 资源管理器中选择文件夹并将其拖动到参数的输入框中，将文件夹指定为输入。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public List<object> _input { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The feature class that will be produced.</para>
        /// <para>将生成的要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Average Point Spacing</para>
        /// <para>The average 2D distance between points in the input file or files. This can be an approximation. If areas have been sampled at different densities, specify the smaller spacing. The value needs to be provided in the projection units of the output coordinate system.</para>
        /// <para>输入文件中一个或多个点之间的平均 2D 距离。这可以是一个近似值。如果以不同的密度对区域进行采样，请指定较小的间距。该值需要在输出坐标系的投影单位中提供。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Average Point Spacing")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public double? _average_point_spacing { get; set; }


        /// <summary>
        /// <para>Class Codes</para>
        /// <para>The classification codes to use as a query filter for LAS data points. Valid values range from 1 to 32. No filter is applied by default.</para>
        /// <para>用作 LAS 数据点查询筛选器的分类代码。有效值范围为 1 到 32。默认情况下不应用任何过滤器。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Class Codes")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _class_code { get; set; } = null;


        /// <summary>
        /// <para>Return Values</para>
        /// <para><xdoc>
        ///   <para>The return values that will be used to filter the LAS points that get imported to multipoint features.</para>
        ///   <bulletList>
        ///     <bullet_item>All Returns—Any returns</bullet_item><para/>
        ///     <bullet_item>1st Return—1</bullet_item><para/>
        ///     <bullet_item>2nd Return—2</bullet_item><para/>
        ///     <bullet_item>3rd Return—3</bullet_item><para/>
        ///     <bullet_item>4th Return—4</bullet_item><para/>
        ///     <bullet_item>5th Return—5</bullet_item><para/>
        ///     <bullet_item>6th Return—6</bullet_item><para/>
        ///     <bullet_item>7th Return—7</bullet_item><para/>
        ///     <bullet_item>8th Return—8</bullet_item><para/>
        ///     <bullet_item>Last Return—Last returns</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>将用于过滤导入到多点要素的 LAS 点的返回值。</para>
        ///   <bulletList>
        ///     <bullet_item>所有退货 - 任何退货</bullet_item><para/>
        ///     <bullet_item>第一次返回 - 1</bullet_item><para/>
        ///     <bullet_item>第二次返回—2</bullet_item><para/>
        ///     <bullet_item>第 3 次返回 - 3</bullet_item><para/>
        ///     <bullet_item>第四次回归—4</bullet_item><para/>
        ///     <bullet_item>第 5 次回归 - 5</bullet_item><para/>
        ///     <bullet_item>第 6 次回归 - 6</bullet_item><para/>
        ///     <bullet_item>第7次回归—7</bullet_item><para/>
        ///     <bullet_item></bullet_item><para/>
        ///     <bullet_item>上次退货 - 上次退货</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Return Values")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _return { get; set; } = null;


        /// <summary>
        /// <para>Input Attribute Names</para>
        /// <para><xdoc>
        ///   <para>The LAS point properties whose values will be stored in binary large object (BLOB) fields in the attribute table of the output. If the resulting features will participate in a terrain dataset, the stored attributes can be used to symbolize the terrain. The Name column indicates the name of the field that will be used to store the specified attributes. The following LAS properties are supported:</para>
        ///   <bulletList>
        ///     <bullet_item>INTENSITY—Intensity</bullet_item><para/>
        ///     <bullet_item>RETURN_NUMBER—Return number</bullet_item><para/>
        ///     <bullet_item>NUMBER_OF_RETURNS—Number of returns per pulse</bullet_item><para/>
        ///     <bullet_item>SCAN_DIRECTION_FLAG —Scan direction flag</bullet_item><para/>
        ///     <bullet_item>EDGE_OF_FLIGHTLINE—Edge of flightline</bullet_item><para/>
        ///     <bullet_item>CLASSIFICATION—Classification</bullet_item><para/>
        ///     <bullet_item>SCAN_ANGLE_RANK—Scan angle rank</bullet_item><para/>
        ///     <bullet_item>FILE_MARKER—File marker</bullet_item><para/>
        ///     <bullet_item>USER_BIT_FIELD—User data value</bullet_item><para/>
        ///     <bullet_item>GPS_TIME—GPS time</bullet_item><para/>
        ///     <bullet_item>COLOR_RED—Red band</bullet_item><para/>
        ///     <bullet_item>COLOR_GREEN—Green band</bullet_item><para/>
        ///     <bullet_item>COLOR_BLUE—Blue band</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>LAS 点属性，其值将存储在输出属性表的二进制大型对象 （BLOB） 字段中。如果生成的要素将参与 terrain 数据集，则存储的属性可用于对地形进行符号化。“名称”列指示将用于存储指定属性的字段的名称。支持以下 LAS 属性：</para>
        ///   <bulletList>
        ///     <bullet_item>INTENSITY - 强度</bullet_item><para/>
        ///     <bullet_item>RETURN_NUMBER - 返回编号</bullet_item><para/>
        ///     <bullet_item>NUMBER_OF_RETURNS - 每个脉冲的返回次数</bullet_item><para/>
        ///     <bullet_item>SCAN_DIRECTION_FLAG —扫描方向标志</bullet_item><para/>
        ///     <bullet_item>EDGE_OF_FLIGHTLINE - 飞行线边缘</bullet_item><para/>
        ///     <bullet_item>分类 （CLASSIFICATION） - 分类</bullet_item><para/>
        ///     <bullet_item>SCAN_ANGLE_RANK - 扫描角度等级</bullet_item><para/>
        ///     <bullet_item>FILE_MARKER - 文件标记</bullet_item><para/>
        ///     <bullet_item>USER_BIT_FIELD - 用户数据值</bullet_item><para/>
        ///     <bullet_item>GPS_TIME—GPS 时间</bullet_item><para/>
        ///     <bullet_item>COLOR_RED - 红色波段</bullet_item><para/>
        ///     <bullet_item>COLOR_GREEN - 绿色波段</bullet_item><para/>
        ///     <bullet_item>COLOR_BLUE - 蓝色波段</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Attribute Names")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _attribute { get; set; } = null;


        /// <summary>
        /// <para>Coordinate System</para>
        /// <para>The coordinate system of the input LAS file.</para>
        /// <para>输入 LAS 文件的坐标系。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Coordinate System")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _input_coordinate_system { get; set; } = null;


        /// <summary>
        /// <para>File Suffix</para>
        /// <para>The suffix of the files that will be imported from an input folder. This parameter is required when a folder is specified as input.</para>
        /// <para>将从输入文件夹导入的文件的后缀。当文件夹指定为输入时，此参数是必需的。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("File Suffix")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _file_suffix { get; set; } = null;


        /// <summary>
        /// <para>Z Factor</para>
        /// <para>The factor by which z-values will be multiplied. This is typically used to convert z linear units to match x,y linear units. The default is 1, which leaves elevation values unchanged. This parameter is not available if the spatial reference of the input surface has a z datum with a specified linear unit.</para>
        /// <para>z 值将乘以的因子。这通常用于转换 z 线性单位以匹配 x，y 线性单位。默认值为 1，使高程值保持不变。如果输入曲面的空间参考具有具有指定线性单位的 z 基准面，则此参数不可用。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Z Factor")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _z_factor { get; set; } = 1;


        /// <summary>
        /// <para>Include Subfolders</para>
        /// <para><xdoc>
        ///   <para>Scans through subfolders when an input folder is selected containing data in a subfolders directory. The output feature class will be generated with a row for each file encountered in the directory structure.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—Only LAS files found in an input folder will be converted to multipoint features. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—All LAS files residing in the subdirectories of an input folder will be converted to multipoint features.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>当选择包含子文件夹目录中数据的输入文件夹时，扫描子文件夹。输出要素类将为目录结构中遇到的每个文件生成一行。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 仅在输入文件夹中找到的 LAS 文件将转换为多点要素。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 驻留在输入文件夹子目录中的所有 LAS 文件都将转换为多点要素。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Include Subfolders")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _folder_recursion_value _folder_recursion { get; set; } = _folder_recursion_value._false;

        public enum _folder_recursion_value
        {
            /// <summary>
            /// <para>RECURSION</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("RECURSION")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_RECURSION</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_RECURSION")]
            [GPEnumValue("false")]
            _false,

        }

        public LASToMultipoint SetEnv(object XYDomain = null, object XYResolution = null, object XYTolerance = null, object ZDomain = null, object ZResolution = null, object ZTolerance = null, int? autoCommit = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object workspace = null)
        {
            base.SetEnv(XYDomain: XYDomain, XYResolution: XYResolution, XYTolerance: XYTolerance, ZDomain: ZDomain, ZResolution: ZResolution, ZTolerance: ZTolerance, autoCommit: autoCommit, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, workspace: workspace);
            return this;
        }

    }

}